import librosa
import numpy as np


def extract_features(file_path, sr=22050, n_mfcc=13, max_pad_len=100):
    """
    从音频文件中提取MFCC特征，并对特征进行填充或截断以确保一致的时间步长。

    参数:
    file_path (str): 音频文件的路径。
    sr (int): 目标采样率，默认为22050 Hz。
    n_mfcc (int): 提取的MFCC系数数量，默认为13。
    max_pad_len (int): 每个样本的最大时间步长，默认为100。

    返回:
    numpy.ndarray: 形状为 (time_steps, n_mfcc) 的MFCC特征矩阵。
    """
    # 加载音频文件。sr=sampling rate采样频率
    audio, _ = librosa.load(file_path, sr=sr)

    # 提取MFCC特征
    mfcc = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=n_mfcc)

    # 对MFCC进行填充或截断，确保每个样本的时间步长一致
    if mfcc.shape[1] < max_pad_len:
        pad_width = max_pad_len - mfcc.shape[1]
        mfcc = np.pad(mfcc, ((0, 0), (0, pad_width)), mode='constant')
    else:
        mfcc = mfcc[:, :max_pad_len]

    # 转置后，形状是 (time_steps, n_mfcc).
    # 转置原因： LSTM 网络期待的输入形状是 (batch_size, sequence_length, input_dim)
    return mfcc.T
